Cloud9でPythonを使ったLambda開発環境の構築をする
こんにちは、データアナリティクス事業本部インテグレーション部コンサルティングチーム・新納(にいの)です。
Pythonを使ったLambda開発環境をCloud9で構築する機会がありました。PythonのバージョンやAWS CLIでちょっとした躓きポイントがあったので備忘として対応手順を残します。
AWS Lambdaで使用されるPythonバージョン確認(2022/7/6時点)
Cloud9で開発を行うにあたり、Lambda関数を作成するのに使用するPythonのバージョンと合わせておきます。まずはAWS Lambdaで使われているバージョンの確認を実施します。Lambda関数の作成時にランタイムをPython3.9に指定できますが、マイナーバージョンも含めた正確なバージョンを把握する目的で調査用のコードを実行します。
Lambda関数の作成
AWSマネジメントコンソールからAWS Lambdaの画面へアクセスし、ランタイムはPython 3.9にして関数を作成します。
調査用のコード
作成した関数に以下コードを記述してDeployし、Testから実行します。テストイベントはデフォルトのまま、イベント名だけ任意のものに変更しておきます。
import os import sys def lambda_handler(event, context): print("===[environment-variables]===") for key, value in os.environ.items(): print(f'{key}: {value}') rtdir=os.environ.get("LAMBDA_RUNTIME_DIR") print("\n===[runtime directory:"+rtdir+"]===") print("===[LAMBDA_RUNTIME_DIR LIST]===") files = os.listdir(rtdir) for file in files: print(file) print("===[LAMBDA_RUNTIME_DIR sys.version]===") print(sys.version) return 0
結果
実行すると、バージョンは3.9.13との結果が返ってきました。(2022/7/6現在)
START RequestId: e82a6347-e9d2-4540-b4cd-969051e9d083 Version: $LATEST ===[environment-variables]=== AWS_LAMBDA_FUNCTION_VERSION: $LATEST : : ===[LAMBDA_RUNTIME_DIR sys.version]=== 3.9.13 (main, Jun 10 2022, 16:49:31) [GCC 7.3.1 20180712 (Red Hat 7.3.1-15)] END RequestId: e82a6347-e9d2-4540-b4cd-969051e9d083 REPORT RequestId: e82a6347-e9d2-4540-b4cd-969051e9d083 Duration: 1.39 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 36 MB Init Duration: 103.62 ms
Cloud9環境にPythonをインストール
前述の調査でAWS Lambdaでは現在Python 3.9.13が使用されていることが分かりました。今度はCloud9環境に同じバージョンのPythonをインストールします。
AWSマネジメントコンソールからCloud9の画面に移動し、IDEを起動します。Cloud9での環境作成については以下のエントリをご参照ください。
Cloud9で使用されているPythonバージョンの確認
まずはPythonのバージョンを確認してみましょう。2022/7/6現在、Cloud9で使用されているバージョンは3.7.10であるようです。
$ python --version Python 3.7.10
pyenvを導入する
バージョン3.7.10と後ほどインストールする3.9.13を切り替えて使えるようにするため、pyenvをインストールします。
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv Cloning into '/home/ec2-user/.pyenv'... remote: Enumerating objects: 21712, done. remote: Counting objects: 100% (470/470), done. remote: Compressing objects: 100% (344/344), done. remote: Total 21712 (delta 336), reused 196 (delta 109), pack-reused 21242 Receiving objects: 100% (21712/21712), 4.38 MiB | 10.21 MiB/s, done. Resolving deltas: 100% (14674/14674), done.
pyenv 2.3.2がインストールされました。
$ ~/.pyenv/bin/pyenv --version pyenv 2.3.2-1-g207f33fc
パスを通すため、~/.bashrc
に設定を追加します。
$ cat << 'EOT' >> ~/.bashrc export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init -)" EOT
sourceコマンドを実行し、設定ファイルを反映させます。
source ~/.bashrc
現在の状態だと、システムにインストールされているPythonが有効になっていることが確認できます。
$ pyenv versions * system (set by /home/ec2-user/.pyenv/version)
Python 3.9.13のインストール
まずはPython3.9.13がインストール可能なバージョン一覧に存在するかどうかを以下コマンドで確認します。
$ pyenv install --list | grep 3.9.13
一覧にあると確認出来たので3.9.13をインストールします。
$ pyenv install 3.9.13 Downloading Python-3.9.13.tar.xz... -> https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tar.xz Installing Python-3.9.13... WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib? WARNING: The Python lzma extension was not compiled. Missing the lzma lib? Installed Python-3.9.13 to /home/ec2-user/.pyenv/versions/3.9.13
WARNINGがでているので、足りないパッゲージbzip2-devel
とxz-devel
をインストールします。
$ sudo yum -y update $ sudo yum -y install bzip2-devel $ sudo yum -y install xz-devel
パッケージの一覧をgrepしてbzip2-devel
とxz-devel
がインストールされていることを確認しておきましょう。
$ sudo yum list installed | grep bzip bzip2.x86_64 1.0.6-13.amzn2.0.3 installed bzip2-devel.x86_64 1.0.6-13.amzn2.0.3 @amzn2-core bzip2-libs.x86_64 1.0.6-13.amzn2.0.3 installed $ sudo yum list installed | grep xz xz.x86_64 5.2.2-1.amzn2.0.3 installed xz-devel.x86_64 5.2.2-1.amzn2.0.3 @amzn2-core xz-libs.x86_64 5.2.2-1.amzn2.0.3 installed
現段階ではpythonのバージョンはシステムの方(3.7.10)が選択されている状態なので、新たにインストールしたバージョンに切り替えます。
$ pyenv global 3.9.13
バージョンを確認すると、3.9.13のほうに切り替わっていることが確認できました。
$ pyenv versions system * 3.9.13 (set by /home/ec2-user/.pyenv/version)
最後にpipをアップデートしておきます。
$ pip install --upgrade pip Requirement already satisfied: pip in /home/ec2-user/.pyenv/versions/3.9.13/lib/python3.9/site-packages (22.0.4) Collecting pip Downloading pip-22.1.2-py3-none-any.whl (2.1 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 44.9 MB/s eta 0:00:00 Installing collected packages: pip Attempting uninstall: pip Found existing installation: pip 22.0.4 Uninstalling pip-22.0.4: Successfully uninstalled pip-22.0.4 Successfully installed pip-22.1.2
AWS CLIをアップデートする
バージョン1系のAWS CLIをアンインストール
2022/7/6現在、Cloud9に導入されているAWS CLIはデフォルトでバージョン1系です。
$ aws --version aws-cli/1.19.112 Python/2.7.18 Linux/4.14.281-212.502.amzn2.x86_64 botocore/1.20.112
これをアンインストールし、新しいバージョンにアップデートしておきます。
$ sudo pip uninstall awscli -y DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/releaseprocess/#python-2-support Found existing installation: awscli 1.19.112 Uninstalling awscli-1.19.112: Successfully uninstalled awscli-1.19.112
バージョン2系のAWS CLIをインストール
バージョン2系のAWSCLIをインストールします。
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 44.7M 100 44.7M 0 0 16.8M 0 0:00:02 0:00:02 --:--:-- 16.8M
$ unzip awscliv2.zip : : : creating: aws/dist/cryptography/hazmat/bindings/ inflating: aws/dist/cryptography/hazmat/bindings/_openssl.abi3.so
$ sudo ./aws/install You can now run: /usr/local/bin/aws --version
タブ補完を有効にする
AWS CLIのコマンドはTabキーで補完可能です。開発効率アップのため、こちらの機能も有効にしておきます。
$ complete -C aws_completer aws $ echo '# aws completer' >> ~/.bash_profile $ echo complete -C \'$(which aws_completer)\' aws >> ~/.bash_profile
sourceコマンドで設定を適用して完了です。
$ source ~/.bash_profile
おわりに
Cloud9でPythonの開発環境を構築してみるの巻でした。お手軽に環境を作ったり壊したりできるのはクラウド上に開発環境があるメリットですね。特にCloud9であればリアルタイムで他のユーザーと一緒にコーディングでき、ターミナルからAWSサービスに簡単にアクセス可能なのもうれしいポイントです。開発環境の構築にお悩みの方のご参考になれば幸いです。